﻿//==============================================================================
// Util 
//==============================================================================

//-------------------------------------------------------------------------
//
//-------------------------------------------------------------------------
#include "stdafx.h"
#include "Asm.h"
#include "Math.h"

//-------------------------------------------------------------------------
//
//-------------------------------------------------------------------------
namespace LNote
{
namespace Core
{
namespace Math
{

//==============================================================================
// ■ Math モジュール
//==============================================================================

	//const lnFloat PI = 3.1415926535897932384626433832795f;	///< 円周率

	static const lnU32 MAX_PRECISION = 65536;

	static lnFloat	sSineTable[ MAX_PRECISION + 1 ];
	static lnFloat	sCosinTable[ MAX_PRECISION + 1 ];
	static lnFloat	sTangentTable[ MAX_PRECISION + 1 ];
	static lnU32		sPrecision = MAX_PRECISION;

	//----------------------------------------------------------------------
	// ● 初期化
	//----------------------------------------------------------------------
	bool initializeTable( lnU32 precision_ )
	{
		if ( precision_ <= 0 || MAX_PRECISION < precision_ ) { 
	return false; }

		sPrecision = precision_;

		lnFloat r;
        lnFloat rc = LMath::PI / ( sPrecision / 2 );

		for ( lnU32 i = 0; i < sPrecision + 1; ++i )
		{
			r = static_cast< lnFloat >( i ) * rc;
			sSineTable[ i ] = sinf( r );
			sCosinTable[ i ] = cosf( r );
			sTangentTable[ i ] = tanf( r );
		}
		return true;
	}

	//----------------------------------------------------------------------
	// ● sin
	//----------------------------------------------------------------------
	lnFloat sinIdx( int r_ )
	{
		return sSineTable[ ( ( r_ < 0 ) ? sPrecision - ( -r_ % sPrecision ) : r_ % sPrecision ) ];
	}

	//----------------------------------------------------------------------
	// ● cos
	//----------------------------------------------------------------------
	lnFloat cosIdx( int r_ )
	{
		// -256 が入った時、[ 256 ] になるのでマズイというわけで + 1 の修正
		return sCosinTable[ ( ( r_ < 0 ) ? sPrecision - ( -r_ % sPrecision ) : r_ % sPrecision ) ];
	}

	//----------------------------------------------------------------------
	// ● tan
	//----------------------------------------------------------------------
	lnFloat tanIdx( int r_ )
	{
		return sTangentTable[ ( ( r_ < 0 ) ? sPrecision - ( -r_ % sPrecision ) : r_ % sPrecision ) ];
	}

//-------------------------------------------------------------------------
//
//-------------------------------------------------------------------------

} // namespace Math
} // namespace Core
} // namespace LNote

//==============================================================================
//
//==============================================================================